#ifndef _ITEM_H
#define _ITEM_H

#define MAX_ITEM_ATTRIBUTE_BLOB_LEN 10

#define MAX_ITEM_TYPE 6

#define MAX_ITEM_ID_NUM 1024

class Item
{
public:
    Item(int id);
    void doItemAction(int aActionID);
    int getID();

protected:
    int m_type;
    int m_id;
    int m_pileNum;
public:
    int data[MAX_ITEM_ATTRIBUTE_BLOB_LEN];
};


class BaseTypeItem;
class BaseItemMgr
{
public:
    BaseItemMgr();
    const BaseTypeItem*        getBaseItemByType(int aType) const;

    const BaseTypeItem*        getBaseItemByID(int aID) const;

    void            registerTypeItem(const BaseTypeItem* pBaseItem);

    void            registerIdItem(const BaseTypeItem* pBaseItem, int id);

private:
    const BaseTypeItem* m_typeArray[MAX_ITEM_TYPE];
    const BaseTypeItem* m_idArray[MAX_ITEM_ID_NUM];
};

class BaseTypeItem
{
protected:

    virtual void        makeItem(Item&) const = 0;
    virtual void        doActionItem(int aActionID ,Item&) const = 0 ;

protected:
    int m_type;

    friend class BaseItemMgr;
    friend class Item;
};


extern BaseItemMgr g_baseItemMgr;

#endif
